package demo4

import (
	"fmt"
)

// 交换函数: *操作符的根本意义就是操作指针指向的变量。
//    当操作在右值时，就是取指向变量的值；当操作在左值时，就是将值设置给指向的变量。
func swap(a, b *int) {
	// 取 a 指针的值, 赋值临时变量 t
	t := *a
	// 取b指针的值, 赋给a指针指向的变量
	*a = *b
	// 将a指针的值赋给b指针指向的变量
	*b = t
}

// TestDemo41 说明
func TestDemo41() {
	/* 1. 指针的基本知识 */
	// & 用来获取指针
	// var cat int = 1
	// var str string = "banana"
	var cat = 1
	var str = "banana"
	fmt.Printf("%p %p", &cat, &str)

	/* 2. 利用指针进行取值和赋值 */
	// & 获取指针后，通过 * 取值
	var house = "Test point 10880"

	// 对字符串取指针地址, ptr类型为*string
	ptr := &house

	// 打印 prt 的类型
	fmt.Printf("ptr type: %T\n", ptr)

	// 对指针进行取值操作
	value := *ptr

	// 取值后的类型
	fmt.Printf("value type: %T\n", value)

	// 指针取值后就是指向变量的值
	fmt.Printf("value: %s", value)

	/* 3. 使用指针修改值 */
	// swap(&x, &y) 通过指针修改值
	x, y := 1, 2
	swap(&x, &y)
	fmt.Println(x, y)

	/* 4. 创建指针的另一种方法——new() 函数 */
	// new() 函数可以创建一个对应类型的指针, 创建过程会分配内存。被创建的指针指向的值为默认值。
	str3 := new(string)
	// 指针指向的变量赋值
	*str3 = "test zhizhen"

	fmt.Println(*str3)
}
